package com.offcn.test;

import com.offcn.bean.Blog;
import com.offcn.bean.IDUtils;
import com.offcn.mapper.BlogMapper;
import com.offcn.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;


public class Demo01 {
    @Test
    public void test(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        Blog blog = new Blog();
        blog.setId(IDUtils.getId());
        blog.setTitle("框架");
        blog.setAuthor("干干");
        blog.setCreateTime(new Date());
        blog.setViews(666);
        int i = mapper.addBlog(blog);
        session.commit();  // 提交事务，不写的话，数据不会插入到数据库中
        System.out.println("是否插入成功："+ i);
        session.close();
    }

    @Test
    public void test2(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        HashMap<String, String> map = new HashMap<String,String>();
        // 如果注释第一行，则sql语句执行错误，因为注释完，sql语句变成
        // select * from blog where and author=#{author}
        map.put("title","优就业123");
        map.put("author","suhui123");
        List<Blog> blogList = mapper.queryBlog(map);
        for (Blog blog:blogList){
            System.out.println(blog);
        }
    }

    @Test
    public void test3(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        HashMap<String, String> map = new HashMap<String,String>();
        // 如注释第一行，sql语句执行不会错误，因为通过<where>标签会修正sql语句变成
        // select * from blog where author=#{author}
        //map.put("title","优就业123");
        map.put("author","中公优就业");
        List<Blog> blogList = mapper.queryBlog2(map);
        for (Blog blog:blogList){
            System.out.println(blog);
        }
    }

    // swich标签进行条件选择
    @Test
    public void test4(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        HashMap<String, String> map = new HashMap<String,String>();
        // 操作：使title为空，author不为空，同时选择了views字段，这样查询的是
        // 所有author:中公优就业，view:9999的记录
        //map.put("title","优就业123");
        map.put("author","中公优就业");
        map.put("views","999");
        List<Blog> blogList = mapper.queryBlogChoose(map);
        for (Blog blog:blogList){
            System.out.println(blog);
        }
    }


    // sql标签：增加代码的复用性，简化代码
    @Test
    public void test5(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        HashMap<String, String> map = new HashMap<String,String>();
        map.put("title","Mybatis如此简单");
        map.put("author","中公优就业");
        List<Blog> blogList = mapper.queryBlog3(map);
        for (Blog blog:blogList){
            System.out.println(blog);
        }
    }

    // foreache标签 将数据库中的前3个id修改为1,2,3
    //需求:我们需要查询blog表中的id分别为1,2,3的博客信息
    @Test
    public void test6(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        HashMap map = new HashMap();
        map.put("ids",ids);
        List<Blog> blogList = mapper.queryBlogForeach(map);
        System.out.println(blogList);
    }

    // 一级缓存默认开启（SqlSession级别，也称为本地缓存）
    // 在同一个会话中，我们查询同一个数据，查询了两次，观看打印日志，发现一个现象：
    // 第一次查询，去数据库中找数据，第二次直接从默认的一级的缓存中拿数据
    @Test
    public void test7(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        List<Blog> blog1 = mapper.queryBlog4(1);
        System.out.println(blog1+"------------");
        List<Blog> blog2 = mapper.queryBlog4(1);
        System.out.println(blog2+"------------");
    }


    // 一级缓存失效：存在不同的sqlsession
    @Test
    public void test8(){
        SqlSession session1 = MybatisUtils.getSession();
        SqlSession session2 = MybatisUtils.getSession();

        BlogMapper mapper1 = session1.getMapper(BlogMapper.class);
        BlogMapper mapper2 = session2.getMapper(BlogMapper.class);

        List<Blog> blog1 = mapper1.queryBlog5(1);
        System.out.println(blog1+"------------");
        List<Blog> blog2 = mapper2.queryBlog5(1);
        System.out.println(blog2+"------------");
    }

    // 一级缓存失效2：查询条件不一样
    @Test
    public void test9(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        List<Blog> blog1 = mapper.queryBlog6(1);
        System.out.println(blog1+"------------");
        List<Blog> blog2 = mapper.queryBlog6(2);
        System.out.println(blog2+"------------");
    }

    // 一级缓存失效3：在你查询数据完以后，接着执行删除，修改的操作，那么一级缓存也会失效

    // 一级缓存失效4：手动清除缓存
    @Test
    public void test10(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        List<Blog> blog1 = mapper.queryBlog7(1);
        session.clearCache();  // 手动清除缓存
        System.out.println(blog1+"------------");
        List<Blog> blog2 = mapper.queryBlog7(1);
        System.out.println(blog2+"------------");
    }


    // 二级缓存：
    //
    //    二级缓存是基于我们的namespace级别的，
    //    工作机制：
    //    一个会话查询一条数据，这个数据就会放到一级缓存中的，如果当前的会话关闭了，这个会话对应的一级缓存就没了，但是，我们想要的是
    //    ，会话关闭了没有问题，但是数据别丢，一级缓存缓存的数据就会保存在二级缓存中。
    //    新建的会话查询信息，就可以从二级缓存中的获取内容，不同的mapper查处的数据就会放到自己对应的缓存中，
    //
    @Test
    public void test11(){
        SqlSession session = MybatisUtils.getSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        List<Blog> blog1 = mapper.queryBlog8(1);
        System.out.println(blog1+"------------");
        List<Blog> blog2 = mapper.queryBlog8(1);
        System.out.println(blog2+"------------");
    }

}
